/**
 * 
 */
package com.mc.tencentyun;
import java.io.File;
import java.util.Arrays;

import com.alibaba.fastjson.JSON;
import com.mc.log.ThisProjectLog;
import com.mc.parameter.Parameter;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.trtc.v20190722.TrtcClient;
import com.tencentcloudapi.trtc.v20190722.models.CloudStorage;
import com.tencentcloudapi.trtc.v20190722.models.CreateCloudRecordingRequest;
import com.tencentcloudapi.trtc.v20190722.models.CreateCloudRecordingResponse;
import com.tencentcloudapi.trtc.v20190722.models.DeleteCloudRecordingRequest;
import com.tencentcloudapi.trtc.v20190722.models.DeleteCloudRecordingResponse;
import com.tencentcloudapi.trtc.v20190722.models.DescribeCloudRecordingRequest;
import com.tencentcloudapi.trtc.v20190722.models.DescribeCloudRecordingResponse;
import com.tencentcloudapi.trtc.v20190722.models.MixLayout;
import com.tencentcloudapi.trtc.v20190722.models.MixLayoutParams;
import com.tencentcloudapi.trtc.v20190722.models.MixTranscodeParams;
import com.tencentcloudapi.trtc.v20190722.models.RecordParams;
import com.tencentcloudapi.trtc.v20190722.models.StorageParams;
import com.tencentcloudapi.trtc.v20190722.models.VideoParams;
import com.tencentcloudapi.trtc.v20190722.models.WaterMark;
import com.tencentcloudapi.trtc.v20190722.models.WaterMarkChar;
import com.tencentcloudapi.trtc.v20190722.models.WaterMarkImage;

import cn.hutool.core.date.DateUtil;
/**
 * 云端录制,混流
 * 
 * @author w.weizhen
 * 
 */
public class RecordTest {
	private static String user0 = "C00D5B9E076C4233B847ED384A3DDE61";
	private static String usig0 = "eJw1jtEKgjAYhd9lt4X8c3NOoYt0KwOJSC-qsnLaMk1UUonePbG6PIfvO5wXisPIUH2la4VczijAfKqeqkYuMg1A39wk*amqdIJczAAAg0l-pE5U2epUT4IPICzPkWAzn5qEeJzaUhBOl0QIyfB-TWcjvGkdSJugHjq9LdaX3eM*i9QQHG6ZY*WdjM99eC1XPNgf6eIntroYf2IbgBGbUP7*AGpCNpQ_";
	private static String user1 = "VFHA4RX78UX8KH5Y7X4PXQADAWX1CLYU";
	private static String user2 = "8ER2ZZSAQUHJ3Y8FHZKGMJ4HZTYZCS0M";
	private static String roomi = "1700634238";
	private static String water = "静安区卫生监督:20231122-1";//"上海星采医疗美容门诊部平明远:20231122-9";
	
    public static void main(String[] args) {
        //开始云端录制
        createCloudRecording();
    	
//        String TaskId = "D1tGCy1RsrIcQnhz0YNPj3i-LO9emCsfCJV+17FuWdt8muIw9pP0FOpOYkgdMNK52kIoPqyKdIiNIa4ZLGDylWD8rAQA";
//        
//        //查询云端录制状态
//        describeCloudRecording(TaskId);
        
//        //停止云端录制任务
//        //通话结束之后应当立即停止云端录制,不然会有一段时间的黑屏,一是体验不好,二是浪费资源.
//        deleteCloudRecording(TaskId);
//        
//        //查询云端录制状态
//        describeCloudRecording(TaskId);
    }
    
    //开始云端录制
    private static void createCloudRecording()
    {
        try{
            // 实例化一个认证对象，入参需要传入腾讯云账户 SecretId 和 SecretKey，此处还需注意密钥对的保密
            // 代码泄露可能会导致 SecretId 和 SecretKey 泄露，并威胁账号下所有资源的安全性。以下代码示例仅供参考，建议采用更安全的方式来使用密钥，请参见：https://cloud.tencent.com/document/product/1278/85305
            // 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取
            Credential cred = new Credential("AKIDFNKWu66wa8c1JH5gvyBKuLkyYuDKH4e3", "c4K0UmtoYYN1awMf4MVUHcWDlIdowrZ6");
            // 实例化一个http选项，可选的，没有特殊需求可以跳过
            HttpProfile httpProfile = new HttpProfile();
            httpProfile.setEndpoint("trtc.tencentcloudapi.com");
            // 实例化一个client选项，可选的，没有特殊需求可以跳过
            ClientProfile clientProfile = new ClientProfile();
            clientProfile.setHttpProfile(httpProfile);
            // 实例化要请求产品的client对象,clientProfile是可选的
            TrtcClient client = new TrtcClient(cred, "ap-shanghai", clientProfile);
            // 实例化一个请求对象,每个接口都会对应一个request对象
            CreateCloudRecordingRequest req = new CreateCloudRecordingRequest();
            req.setSdkAppId(1600010240L);//TRTC的SdkAppId，和录制的房间所对应的SdkAppId相同。
            //房间号使用时间戳
            req.setRoomId(roomi);//TRTC的RoomId，录制的TRTC房间所对应的RoomId。
            //req.setRoomIdType(0L);//TRTC房间号的类型。【*注意】必须和录制的房间所对应的RoomId类型相同:0: 字符串类型的RoomId 1: 32位整型的RoomId（默认）
            //录制机器人的UserId，用于进房发起录制任务。
            //【*注意】这个UserId不能与当前房间内的主播观众UserId重复，也不可能指定相同的录制机器人UserId同时进房。建议可以把房间ID作为UserId的标识的一部分，即录制机器人UserId在房间内唯一。
            req.setUserId(user0);
            //录制机器人UserId对应的校验签名，即UserId和UserSig相当于录制机器人进房的登录密码，具体计算方法请参考TRTC计算UserSig的方案。
            req.setUserSig(usig0);
            //云端录制控制参数。
            RecordParams recordParams = new RecordParams();
            //录制模式：
            //1：单流录制，分别录制房间的订阅UserId的音频和视频，将录制文件上传至云存储；
            //2：混流录制，将房间内订阅UserId的音视频混录成一个音视频文件，将录制文件上传至云存储；
            recordParams.setRecordMode(2L);
            //房间内持续没有用户（主播）上行推流的状态超过MaxIdleTime的时长，自动停止录制，单位：秒。默认值为 30 秒，该值需大于等于 5秒，且小于等于 86400秒(24小时)。
            recordParams.setMaxIdleTime(5L);
            //输出文件的格式（存储至COS等第三方存储时有效）。0：(默认)输出文件为hls格式。1：输出文件格式为hls+mp4。2：输出文件格式为hls+aac 。3：输出文件格式为mp4。4：输出文件格式为aac。
            //存储到云点播VOD时此参数无效，存储到VOD时请通过TencentVod（https://cloud.tencent.com/document/api/647/44055#TencentVod）内的MediaType设置。
            recordParams.setOutputFormat(3L);
            //如果是aac或者mp4文件格式，超过长度限制后，系统会自动拆分视频文件。单位：分钟。默认为1440min（24h），取值范围为1-1440。【单文件限制最大为2G，满足文件大小 >2G 或录制时长度 > 24h任意一个条件，文件都会自动切分】
            //Hls 格式录制此参数不生效。
            recordParams.setMaxMediaFileDuration(1L);
            req.setRecordParams(recordParams);
            
            
//            //这种情况下两个视频分别占用整个画面的一半.
//            //录制的混流布局参数。
//            //3：九宫格布局（默认）
//            MixLayoutParams mixLayoutParams = new MixLayoutParams();
//            //布局模式:
//            //1：悬浮布局；
//            //2：屏幕分享布局；
//            //3：九宫格布局（默认）；
//            //4：自定义布局；
//            mixLayoutParams.setMixLayoutMode(3L);
//            //0 ：拉伸模式，这个模式下整个视频内容会全部显示，并填满子画面，在源视频和目的视频宽高比不一致的时候，画面不会缺少内容，但是画面可能产生形变；
//            //1 ：剪裁模式（默认），这个模式下会严格按照目的视频的宽高比对源视频剪裁之后再拉伸，并填满子画面画布，在源视频和目的视频宽高比不一致的时候，画面保持不变形，但是会被剪裁；
//            //2 ：填黑模式，这个模式下会严格保持源视频的宽高比进行等比缩放，在源视频和目的视频宽高比不一致的时候，画面的上下侧边缘或者左右侧边缘会露出子画面画布的背景；
//            //3 ：智能拉伸模式，这个模式类似剪裁模式，区别是在源视频和目的视频宽高比不一致的时候，限制了最大剪裁比例为画面的宽度或者高度的20%；
//            mixLayoutParams.setRenderMode(2L);
//            req.setMixLayoutParams(mixLayoutParams);
//            //录制的音视频转码参数。
//            //这里需要设置视频大小,不设置的时候可能会出现视频画面小于整个画面,出现大片空余.
//            //注意: 这时候指定的小窗口是在左下角.
//            MixTranscodeParams mixTranscodeParams = new MixTranscodeParams();
//            //录制视频转码参数。
//            //录制视频转码参数，注意如果设置了这个参数，那么里面的字段都是必填的，没有默认值，如果不填这个参数，那么取值为默认值。
//            VideoParams videoParams = new VideoParams();
//            videoParams.setWidth(1920L);//视频的宽度值，单位为像素，默认值360。不能超过1920，与height的乘积不能超过1920*1080。
//            videoParams.setHeight(1080L);//视频的高度值，单位为像素，默认值640。不能超过1920，与width的乘积不能超过1920*1080。
//            videoParams.setFps(15L);//视频的帧率，范围[1, 60]，默认15。
//            videoParams.setBitRate(550000L);//视频的码率,单位是bps，范围[64000, 8192000]，默认550000bps。
//            videoParams.setGop(10L);//视频关键帧时间间隔，单位秒，默认值10秒。
//            mixTranscodeParams.setVideoParams(videoParams);
//            req.setMixTranscodeParams(mixTranscodeParams);
            
            
            
            
//            //这种情况下,设置一个画面作为背景,一个画面在整个画面的左下方.
//            //1：悬浮布局；
//            //悬浮布局：默认第一个进入房间的主播（也可以指定一个主播）的视频画面会铺满整个屏幕。
//            //其他主播的视频画面从左下角开始依次按照进房顺序水平排列，显示为小画面，小画面悬浮于大画面之上。
//            //当画面数量小于等于17个时，每行4个（4 x 4排列）。当画面数量大于17个时，重新布局小画面为每行5个（5 x 5）排列。
//            //最多支持25个画面，如果用户只发送音频，仍然会占用画面位置。
//            MixLayoutParams mixLayoutParams = new MixLayoutParams();
//            //布局模式:
//            //1：悬浮布局；
//            //2：屏幕分享布局；
//            //3：九宫格布局（默认）；
//            //4：自定义布局；
//            mixLayoutParams.setMixLayoutMode(1L);
//            //0 ：拉伸模式，这个模式下整个视频内容会全部显示，并填满子画面，在源视频和目的视频宽高比不一致的时候，画面不会缺少内容，但是画面可能产生形变；
//            //1 ：剪裁模式（默认），这个模式下会严格按照目的视频的宽高比对源视频剪裁之后再拉伸，并填满子画面画布，在源视频和目的视频宽高比不一致的时候，画面保持不变形，但是会被剪裁；
//            //2 ：填黑模式，这个模式下会严格保持源视频的宽高比进行等比缩放，在源视频和目的视频宽高比不一致的时候，画面的上下侧边缘或者左右侧边缘会露出子画面画布的背景；
//            //3 ：智能拉伸模式，这个模式类似剪裁模式，区别是在源视频和目的视频宽高比不一致的时候，限制了最大剪裁比例为画面的宽度或者高度的20%；
//            mixLayoutParams.setRenderMode(2L);
//            //在布局模式为1：悬浮布局和 2：屏幕分享布局时，设定为显示大视频画面的UserId。
//            //不填的话：悬浮布局默认是第一个进房间的主播，屏幕分享布局默认是背景色
//            String MaxResolutionUserId = "001D03BE3A0B462EBB65788357C4DD85";//"yl_b";
//            mixLayoutParams.setMaxResolutionUserId(MaxResolutionUserId);
//            req.setMixLayoutParams(mixLayoutParams);
//            
//            //录制的音视频转码参数。
//            //这里需要设置视频大小,不设置的时候可能会出现视频画面小于整个画面,出现大片空余.
//            //注意: 这时候指定的小窗口是在左下角.
//            MixTranscodeParams mixTranscodeParams = new MixTranscodeParams();
//            //录制视频转码参数。
//            //录制视频转码参数，注意如果设置了这个参数，那么里面的字段都是必填的，没有默认值，如果不填这个参数，那么取值为默认值。
//            VideoParams videoParams = new VideoParams();
//            videoParams.setWidth(1920L);//视频的宽度值，单位为像素，默认值360。不能超过1920，与height的乘积不能超过1920*1080。
//            videoParams.setHeight(1080L);//视频的高度值，单位为像素，默认值640。不能超过1920，与width的乘积不能超过1920*1080。
//            videoParams.setFps(15L);//视频的帧率，范围[1, 60]，默认15。
//            videoParams.setBitRate(550000L);//视频的码率,单位是bps，范围[64000, 8192000]，默认550000bps。
//            videoParams.setGop(10L);//视频关键帧时间间隔，单位秒，默认值10秒。
//            mixTranscodeParams.setVideoParams(videoParams);
//            req.setMixTranscodeParams(mixTranscodeParams);
            
            
            //可以根据自定义布局调整小窗口的位置/大小等.
            //4：自定义布局；自定义布局：根据需要在MixLayoutList内定制每个主播画面的布局。
            MixLayoutParams mixLayoutParams = new MixLayoutParams();
            //布局模式:
            //1：悬浮布局；
            //2：屏幕分享布局；
            //3：九宫格布局（默认）；
            //4：自定义布局；
            mixLayoutParams.setMixLayoutMode(4L);
            //0 ：拉伸模式，这个模式下整个视频内容会全部显示，并填满子画面，在源视频和目的视频宽高比不一致的时候，画面不会缺少内容，但是画面可能产生形变；
            //1 ：剪裁模式（默认），这个模式下会严格按照目的视频的宽高比对源视频剪裁之后再拉伸，并填满子画面画布，在源视频和目的视频宽高比不一致的时候，画面保持不变形，但是会被剪裁；
            //2 ：填黑模式，这个模式下会严格保持源视频的宽高比进行等比缩放，在源视频和目的视频宽高比不一致的时候，画面的上下侧边缘或者左右侧边缘会露出子画面画布的背景；
            //3 ：智能拉伸模式，这个模式类似剪裁模式，区别是在源视频和目的视频宽高比不一致的时候，限制了最大剪裁比例为画面的宽度或者高度的20%；
//            mixLayoutParams.setRenderMode(2L);
            
            
            //如果MixLayoutMode 选择为4自定义布局模式的话，设置此参数为每个主播所对应的布局画面的详细信息，最大不超过25个。
            /**
             * 目前设置的百分之十显示的小窗口还非常小,应当设置小窗口为百分之二十以上,百分之三十左右.
             * 设置百分之十为192*108
             * 设置百分之二十为384*216
             * 设置百分之三十为576*324
             */
            MixLayout wjMixLayout = new MixLayout();
            wjMixLayout.setUserId(user1);//("wj_a");//字符串内容为待显示在该画面的主播对应的UserId，如果不指定，会按照主播加入房间的顺序匹配。
            wjMixLayout.setImageLayer(100L);//该画布的图层顺序, 这个值越小表示图层越靠后。默认值为0。
            wjMixLayout.setTop(10L);//画布上该画面左上角的 y 轴坐标，取值范围 [0, 1920]，不能超过画布的高。
            wjMixLayout.setLeft(10L);//画布上该画面左上角的 x 轴坐标，取值范围 [0, 1920]，不能超过画布的宽。
            wjMixLayout.setWidth(384L);//画布上该画面宽度的相对值，取值范围 [0, 1920]，与Left相加不应超过画布的宽。
            wjMixLayout.setHeight(216L);//画布上该画面高度的相对值，取值范围 [0, 1920]，与Top相加不应超过画布的高。
            wjMixLayout.setAlpha(0L);//画布的透明度值，取值范围[0, 255]。0表示不透明，255表示全透明。默认值为0。
            //0 ：拉伸模式，这个模式下整个视频内容会全部显示，并填满子画面，在源视频和目的视频宽高比不一致的时候，画面不会缺少内容，但是画面可能产生形变；
            //1 ：剪裁模式（默认），这个模式下会严格按照目的视频的宽高比对源视频剪裁之后再拉伸，并填满子画面画布，在源视频和目的视频宽高比不一致的时候，画面保持不变形，但是会被剪裁；
            //2 ：填黑模式，这个模式下会严格保持源视频的宽高比进行等比缩放，在源视频和目的视频宽高比不一致的时候，画面的上下侧边缘或者左右侧边缘会露出子画面画布的背景；
            //3 ：智能拉伸模式，这个模式类似剪裁模式，区别是在源视频和目的视频宽高比不一致的时候，限制了最大剪裁比例为画面的宽度或者高度的20%；
            wjMixLayout.setRenderMode(2L);//
            
            MixLayout ylMixLayout = new MixLayout();
            ylMixLayout.setUserId(user2);//("yl_b");//字符串内容为待显示在该画面的主播对应的UserId，如果不指定，会按照主播加入房间的顺序匹配。
            ylMixLayout.setImageLayer(0L);//该画布的图层顺序, 这个值越小表示图层越靠后。默认值为0。
            ylMixLayout.setTop(0L);//画布上该画面左上角的 y 轴坐标，取值范围 [0, 1920]，不能超过画布的高。
            ylMixLayout.setLeft(0L);//画布上该画面左上角的 x 轴坐标，取值范围 [0, 1920]，不能超过画布的宽。
            ylMixLayout.setWidth(1920L);//画布上该画面宽度的相对值，取值范围 [0, 1920]，与Left相加不应超过画布的宽。
            ylMixLayout.setHeight(1080L);//画布上该画面高度的相对值，取值范围 [0, 1920]，与Top相加不应超过画布的高。
            ylMixLayout.setAlpha(0L);//画布的透明度值，取值范围[0, 255]。0表示不透明，255表示全透明。默认值为0。
            //0 ：拉伸模式，这个模式下整个视频内容会全部显示，并填满子画面，在源视频和目的视频宽高比不一致的时候，画面不会缺少内容，但是画面可能产生形变；
            //1 ：剪裁模式（默认），这个模式下会严格按照目的视频的宽高比对源视频剪裁之后再拉伸，并填满子画面画布，在源视频和目的视频宽高比不一致的时候，画面保持不变形，但是会被剪裁；
            //2 ：填黑模式，这个模式下会严格保持源视频的宽高比进行等比缩放，在源视频和目的视频宽高比不一致的时候，画面的上下侧边缘或者左右侧边缘会露出子画面画布的背景；
            //3 ：智能拉伸模式，这个模式类似剪裁模式，区别是在源视频和目的视频宽高比不一致的时候，限制了最大剪裁比例为画面的宽度或者高度的20%；
            ylMixLayout.setRenderMode(2L);//
            mixLayoutParams.setMixLayoutList(new MixLayout[] { wjMixLayout, ylMixLayout });
//            mixLayoutParams.setRenderMode(2L);
            
            
            //水印布局参数， 最多支持25个。
            WaterMark waterMark = new WaterMark();
//            //图片水印
//            waterMark.setWaterMarkType(0L);//水印类型，0为图片（默认），1为文字，2为时间戳。
//            WaterMarkImage waterMarkImage = new WaterMarkImage();
//            String waterMarkUrl = "https://sh.hynetic.cn/shjahi-wjs/ct/hs-blend/module/face/img/wjs.png";
//            waterMarkImage.setWaterMarkUrl(waterMarkUrl);//下载的url地址， 只支持jpg， png，大小限制不超过5M。 示例值：https://xxxx
//            waterMarkImage.setTop(10L);//画布上该画面左上角的 y 轴坐标，取值范围 [0, 2560]，不能超过画布的高。
//            waterMarkImage.setLeft(1710L);//画布上该画面左上角的 x 轴坐标，取值范围 [0, 2560]，不能超过画布的宽。
//            waterMarkImage.setWidth(200L);//画布上该画面宽度的相对值，取值范围 [0, 2560]，与Left相加不应超过画布的宽。
//            waterMarkImage.setHeight(200L);//画布上该画面高度的相对值，取值范围 [0, 2560]，与Top相加不应超过画布的高。
//            waterMark.setWaterMarkImage(waterMarkImage);//水印为图片时的参数列表，水印为图片时校验必填。
            
            //文字水印
            waterMark.setWaterMarkType(1L);//水印类型，0为图片（默认），1为文字，2为时间戳。
            Long fontSize = 50L;//水印文字的大小，单位像素，默认14
            WaterMarkChar waterMarkChar = new WaterMarkChar();
            waterMarkChar.setTop(1000L);//必选 文字水印的起始坐标Y值，从左上角开始
            long width = (water.length() * fontSize) - 100;
            waterMarkChar.setLeft(1920L - width + 35);//必选 文字水印的起始坐标X值，从左上角开始
            waterMarkChar.setWidth(width - 35);//必选 文字水印的宽度，单位像素值
            waterMarkChar.setHeight(fontSize);//必选 文字水印的高度，单位像素值
            //waterMarkChar.setChars("中国卫生监督");//必选 水印文字的内容
            waterMarkChar.setChars(water);//必选 水印文字的内容
            waterMarkChar.setFontSize(fontSize);//水印文字的大小，单位像素，默认14
            waterMarkChar.setFontColor("0x4169E1");//水印文字的颜色，默认白色
            //waterMarkChar.setBackGroundColor("0x4169E1");//水印文字的背景色，为空代表背景透明，默认为空
            waterMark.setWaterMarkChar(waterMarkChar);//水印为文字时的参数列表，水印为文字时校验必填。
            //waterMark.setWaterMarkTimestamp(waterMarkTimestamp);//水印为时间戳时的参数列表，水印为时间戳时校验必填。
            mixLayoutParams.setWaterMarkList(new WaterMark[] { waterMark });
            req.setMixLayoutParams(mixLayoutParams);
            
            
            //录制的音视频转码参数。
            //这里需要设置视频大小,不设置的时候可能会出现视频画面小于整个画面,出现大片空余.
            //注意: 这时候指定的小窗口是在左下角.
            MixTranscodeParams mixTranscodeParams = new MixTranscodeParams();
            //录制视频转码参数。
            //录制视频转码参数，注意如果设置了这个参数，那么里面的字段都是必填的，没有默认值，如果不填这个参数，那么取值为默认值。
            VideoParams videoParams = new VideoParams();
            videoParams.setWidth(1920L);//视频的宽度值，单位为像素，默认值360。不能超过1920，与height的乘积不能超过1920*1080。
            videoParams.setHeight(1080L);//视频的高度值，单位为像素，默认值640。不能超过1920，与width的乘积不能超过1920*1080。
            videoParams.setFps(15L);//视频的帧率，范围[1, 60]，默认15。
            videoParams.setBitRate(550000L);//视频的码率,单位是bps，范围[64000, 8192000]，默认550000bps。
            videoParams.setGop(10L);//视频关键帧时间间隔，单位秒，默认值10秒。
            mixTranscodeParams.setVideoParams(videoParams);
            req.setMixTranscodeParams(mixTranscodeParams);
            
            //第三方存储参数。存储服务器信息
            //云端录制文件上传到云存储的参数(目前支持云点播VOD和对象存储COS)。点播和对象存储的参数必填其中之一，不支持同时设置点播和对象存储。
            StorageParams storageParams = new StorageParams();
            CloudStorage cloudStorage = new CloudStorage();
            //第三方云储存的供应商:
            //0：腾讯云存储 COS。
            //【*注意】：目前第三方仅支持腾讯云存储COS，暂不支持AWS等其他第三方云存储。
            cloudStorage.setVendor(0L);
            //第三方云存储的地域信息。
            cloudStorage.setRegion("ap-nanjing");
            //第三方存储桶信息。
            cloudStorage.setBucket("fxczf-1321690287");
            //第三方存储的access_key账号信息。
            //若存储至腾讯云COS，请前往https://console.cloud.tencent.com/cam/capi 查看或创建，对应链接中密钥字段的SecretId值。
            cloudStorage.setAccessKey("AKIDFNKWu66wa8c1JH5gvyBKuLkyYuDKH4e3");
            //第三方存储的secret_key账号信息。
            //若存储至腾讯云COS，请前往https://console.cloud.tencent.com/cam/capi 查看或创建，对应链接中密钥字段的SecretKey值。
            cloudStorage.setSecretKey("c4K0UmtoYYN1awMf4MVUHcWDlIdowrZ6");
            storageParams.setCloudStorage(cloudStorage);
            
            req.setStorageParams(storageParams);
//            req.set
//            req.set
            // 返回的resp是一个CreateCloudRecordingResponse的实例，与请求对象对应
            CreateCloudRecordingResponse resp = client.CreateCloudRecording(req);
            // 输出json格式的字符串回包
            String rep = CreateCloudRecordingResponse.toJsonString(resp);
            System.out.println(rep);
            //输入到日志
            log("[createCloudRecording]" + rep);
        } catch (TencentCloudSDKException e) {
            System.out.println(e.toString());
        }
        
    }
    
    //查询云端录制状态
    private static void describeCloudRecording(String TaskId)
    {
        
        try{
            // 实例化一个认证对象，入参需要传入腾讯云账户 SecretId 和 SecretKey，此处还需注意密钥对的保密
            // 代码泄露可能会导致 SecretId 和 SecretKey 泄露，并威胁账号下所有资源的安全性。以下代码示例仅供参考，建议采用更安全的方式来使用密钥，请参见：https://cloud.tencent.com/document/product/1278/85305
            // 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取
            Credential cred = new Credential("AKIDFNKWu66wa8c1JH5gvyBKuLkyYuDKH4e3", "c4K0UmtoYYN1awMf4MVUHcWDlIdowrZ6");
            // 实例化一个http选项，可选的，没有特殊需求可以跳过
            HttpProfile httpProfile = new HttpProfile();
            httpProfile.setEndpoint("trtc.tencentcloudapi.com");
            // 实例化一个client选项，可选的，没有特殊需求可以跳过
            ClientProfile clientProfile = new ClientProfile();
            clientProfile.setHttpProfile(httpProfile);
            // 实例化要请求产品的client对象,clientProfile是可选的
            TrtcClient client = new TrtcClient(cred, "ap-shanghai", clientProfile);
            // 实例化一个请求对象,每个接口都会对应一个request对象
            DescribeCloudRecordingRequest req = new DescribeCloudRecordingRequest();
            req.setSdkAppId(1600010240L);//TRTC的SdkAppId，和录制的房间所对应的SdkAppId相同。
            req.setTaskId(TaskId);//录制任务的唯一Id，在启动录制成功后会返回。
            // 返回的resp是一个DescribeCloudRecordingResponse的实例，与请求对象对应
            DescribeCloudRecordingResponse resp = client.DescribeCloudRecording(req);
            // 输出json格式的字符串回包
            String rep = DescribeCloudRecordingResponse.toJsonString(resp);
            System.out.println(rep);
            //输入到日志
            log("[describeCloudRecording]" + rep);
        } catch (TencentCloudSDKException e) {
            System.out.println(e.toString());
        }
        
    }
    
    
    private static void deleteCloudRecording(String TaskId)
    {
        try{
            // 实例化一个认证对象，入参需要传入腾讯云账户 SecretId 和 SecretKey，此处还需注意密钥对的保密
            // 代码泄露可能会导致 SecretId 和 SecretKey 泄露，并威胁账号下所有资源的安全性。以下代码示例仅供参考，建议采用更安全的方式来使用密钥，请参见：https://cloud.tencent.com/document/product/1278/85305
            // 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取
            Credential cred = new Credential("AKIDFNKWu66wa8c1JH5gvyBKuLkyYuDKH4e3", "c4K0UmtoYYN1awMf4MVUHcWDlIdowrZ6");
            // 实例化一个http选项，可选的，没有特殊需求可以跳过
            HttpProfile httpProfile = new HttpProfile();
            httpProfile.setEndpoint("trtc.tencentcloudapi.com");
            // 实例化一个client选项，可选的，没有特殊需求可以跳过
            ClientProfile clientProfile = new ClientProfile();
            clientProfile.setHttpProfile(httpProfile);
            // 实例化要请求产品的client对象,clientProfile是可选的
            TrtcClient client = new TrtcClient(cred, "ap-shanghai", clientProfile);
            
            // 实例化一个请求对象,每个接口都会对应一个request对象
            DeleteCloudRecordingRequest req = new DeleteCloudRecordingRequest();
            req.setSdkAppId(1600010240L);//TRTC的SdkAppId，和录制的房间所对应的SdkAppId相同。
            req.setTaskId(TaskId);
            
            // 返回的resp是一个DeleteCloudRecordingResponse的实例，与请求对象对应
            DeleteCloudRecordingResponse resp = client.DeleteCloudRecording(req);
            // 输出json格式的字符串回包
            String rep = DeleteCloudRecordingResponse.toJsonString(resp);
            System.out.println(rep);
            //输入到日志
            log("[deleteCloudRecording]" + rep);
        } catch (TencentCloudSDKException e) {
            System.out.println(e.toString());
        }
    }
    
    //生成日志
    private static void log(String log)
    {
    	//输入到日志
        String path = Parameter.data_path + "tencentyun" + File.separator + DateUtil.today() + "_RecordTest.log";
        ThisProjectLog.createLog(path, Arrays.asList(DateUtil.now() + "  :  " + log));
    }
}